<html>
    <head>
        <title>覆盖服务类</title>
    </head>
    <body>
        <script>
             /*
                    二、覆盖服务类  Overriding a Service Class

                                大多数情况下，你会希望更改服务当前实现的一个或几个方法。

                                在这种情况下，重新实现完整的接口效率不高。

                                作为更好的方法，"从原始类继承并覆盖所需的方法"。

                                eg: 覆盖应用程序服务

                                                [Dependency(ReplaceServices = true)]  // 替换接口服务
                                                [ExposeServices(typeof(IIdentityUserAppService), typeof(IdentityUserAppService), typeof(MyIdentityUserAppService))]
                                                public class MyIdentityUserAppService : IdentityUserAppService
                                                {
                                                    //  覆盖构造函数，以便我们可以注入我们自己的依赖项。

                                                    public MyIdentityUserAppService(
                                                        IdentityUserManager userManager,
                                                        IIdentityUserRepository userRepository,
                                                        IGuidGenerator guidGenerator
                                                    ) : base(
                                                        userManager,
                                                        userRepository,
                                                        guidGenerator)
                                                    {
                                                    }


                                                    // 重写父类的方法
                                                    public async override Task<IdentityUserDto> CreateAsync(IdentityUserCreateDto input)
                                                    {
                                                        // 添加对电话号码的验证
                                                        if (input.PhoneNumber.IsNullOrWhiteSpace())
                                                        {
                                                            throw new AbpValidationException(
                                                                "Phone number is required for new users!",
                                                                new List<ValidationResult>
                                                                {
                                                                    new ValidationResult(
                                                                        "Phone number can not be empty!",
                                                                        new []{"PhoneNumber"}
                                                                    )
                                                                }
                                                            );        }

                                                        return await base.CreateAsync(input);  // 调用父类方法继续底层业务逻辑
                                                    }
                                                }

                                        这个类覆盖IdentityUserAppServiceapplication service的CreateAsync方法来检查电话号码。

                                        然后调用base方法继续到底层业务逻辑。这样，你可以在之前执行额外的业务逻辑，在之后执行。

                                        你可以完全重写用于用户创建的整个业务逻辑，而无需调用base方法。

                */

        </script>
    </body>
</html>